package common;

import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;

/**
 * @Description: TODO
 * @Author 50705 2021/10/16
 *
 * 自定义简易版SpringBoot，实现SpringBoot MVC及内嵌Tomcat启动、DispatcherServlet注册和组件扫描功能。
 *
 * 程序通过main方法启动，可以自动启动tomcat服务器
 *
 * 可以自动创建和加载DispatcherServlet组件到ServletContext中
 *
 * 可以自动通过@ComponentScan扫描Controller等组件
 *
 * Controller组件可以处理浏览器请求，返回响应结果

 ******************************************************************************************
 * 实现前提：
 *
 * Servlet3.0的容器在启动时会通过SPI扩展机制自动扫描
 * 所有jar包里META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的全路径类
 * （该类需实现ServletContainerInitializer接口），并实例化该类，并回调类中的onStartup方法。
 *
 *
 * 实现思路：
 * 1.编写MySpringServletContainerInitializer 对接servlet3.
 *      i.实现ServletContainerInitializer#onStartup调用webApplicationInitializer#onStartup
 *      ii.新建META-INF/services/javax.servlet.ServletContainerInitializer文件，指向MySpringServletContainerInitializer
 *
 * 2.编写MyWebApplicationInitializer实现WebApplicationInitializer，onStartup如下：
 *      i.创建IOC容器，注入配置类
 *      ii.创建DispatcherServlet放入ServletContext
 *
 * 3.编写Controller，写个get请求返回 hello world
 *
 * 4.编写SpringApplication类，run方法中启动tomcat
 *
 * 5.编写主类，去掉用4中的run方法
 *
 * 6.页面访问3中url
 *
 *
 * 坑：
 *  1.tomcat启动时要加入：tomcat.addWebapp("/", "D:\\"); 不然不会回调到MySpringServletContainerInitializer
 *  2.MyWebApplicationInitializer只要实现了WebApplicationInitializer就会被回调，第二次会NPE
 *  3.实测将MyWebApplicationInitializer里逻辑写在MySpringServletContainerInitializer也一样的，可能为了配合源码设计流程所以多写了
 *
 *
 **/
public class SpringApplication {


    public static void run(Class clazz) throws Exception {
        Tomcat tomcat = new Tomcat();
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(8080);
        tomcat.addWebapp("/", "D:\\");
        tomcat.getService().addConnector(connector);
        tomcat.setConnector(connector);
        tomcat.getHost().setAutoDeploy(false);
        tomcat.start();
        tomcat.getServer().await();

    }


}
